package com.zenithmind.coding.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 编程课程实体类 - 遵循单一职责原则，专门处理课程基本信息
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@TableName("coding_course")
@Schema(description = "编程课程实体")
public class CodingCourse extends BaseEntity {

    /**
     * 课程标题
     */
    @Schema(description = "课程标题")
    @EqualsAndHashCode.Include
    private String title;

    /**
     * 课程副标题
     */
    @Schema(description = "课程副标题")
    private String subtitle;

    /**
     * 课程描述
     */
    @Schema(description = "课程描述")
    private String description;

    /**
     * 课程封面图片
     */
    @Schema(description = "课程封面图片")
    private String coverImage;

    /**
     * 课程分类ID
     */
    @Schema(description = "课程分类ID")
    private String categoryId;

    /**
     * 课程分类名称
     */
    @Schema(description = "课程分类名称")
    private String categoryName;

    /**
     * 编程语言
     */
    @Schema(description = "编程语言")
    private String language;

    /**
     * 课程标签（JSON格式）
     */
    @Schema(description = "课程标签（JSON格式）")
    private String tags;

    /**
     * 难度等级（1-入门，2-初级，3-中级，4-高级，5-专家）
     */
    @Schema(description = "难度等级（1-入门，2-初级，3-中级，4-高级，5-专家）")
    private Integer difficulty;

    /**
     * 课程类型（1-基础教程，2-实战项目，3-算法专题，4-面试准备）
     */
    @Schema(description = "课程类型（1-基础教程，2-实战项目，3-算法专题，4-面试准备）")
    private Integer type;

    /**
     * 课程状态（0-草稿，1-已发布，2-已下架，3-审核中）
     */
    @Schema(description = "课程状态（0-草稿，1-已发布，2-已下架，3-审核中）")
    private Integer status;

    /**
     * 课程价格（0表示免费）
     */
    @Schema(description = "课程价格（0表示免费）")
    private Double price;

    /**
     * 预计学习时长（小时）
     */
    @Schema(description = "预计学习时长（小时）")
    private Integer estimatedHours;

    /**
     * 章节数量
     */
    @Schema(description = "章节数量")
    private Integer chapterCount;

    /**
     * 练习题数量
     */
    @Schema(description = "练习题数量")
    private Integer exerciseCount;

    /**
     * 项目数量
     */
    @Schema(description = "项目数量")
    private Integer projectCount;

    /**
     * 学习人数
     */
    @Schema(description = "学习人数")
    private Long studentCount;

    /**
     * 完成人数
     */
    @Schema(description = "完成人数")
    private Long completedCount;

    /**
     * 课程评分
     */
    @Schema(description = "课程评分")
    private Double rating;

    /**
     * 评价数量
     */
    @Schema(description = "评价数量")
    private Long reviewCount;

    /**
     * 讲师ID
     */
    @Schema(description = "讲师ID")
    private String instructorId;

    /**
     * 讲师名称
     */
    @Schema(description = "讲师名称")
    private String instructorName;

    /**
     * 讲师头像
     */
    @Schema(description = "讲师头像")
    private String instructorAvatar;

    /**
     * 先修要求
     */
    @Schema(description = "先修要求")
    private String prerequisites;

    /**
     * 学习目标
     */
    @Schema(description = "学习目标")
    private String objectives;

    /**
     * 课程大纲（JSON格式）
     */
    @Schema(description = "课程大纲（JSON格式）")
    private String syllabus;

    /**
     * 是否推荐（0-否，1-是）
     */
    @Schema(description = "是否推荐（0-否，1-是）")
    private Integer isRecommend;

    /**
     * 是否热门（0-否，1-是）
     */
    @Schema(description = "是否热门（0-否，1-是）")
    private Integer isHot;

    /**
     * 是否新课程（0-否，1-是）
     */
    @Schema(description = "是否新课程（0-否，1-是）")
    private Integer isNew;

    /**
     * 发布时间
     */
    @Schema(description = "发布时间")
    private LocalDateTime publishTime;

    /**
     * 最后更新时间
     */
    @Schema(description = "最后更新时间")
    private LocalDateTime lastUpdateTime;

    /**
     * 排序值
     */
    @Schema(description = "排序值")
    private Integer sortOrder;

    /**
     * 重写equals方法以确保里氏替换原则
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;

        CodingCourse course = (CodingCourse) obj;
        return Objects.equals(title, course.title);
    }

    /**
     * 重写hashCode方法以确保里氏替换原则
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), title);
    }

    /**
     * 检查课程是否已发布
     */
    public boolean isPublished() {
        return Integer.valueOf(1).equals(this.status);
    }

    /**
     * 检查课程是否免费
     */
    public boolean isFree() {
        return price != null && price.equals(0.0);
    }
}
